home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Almathera Ten Pack 2: CDPD 1
/
Almathera Ten on Ten - Disc 2: CDPD 1.iso
/
pd
/
351-375
/
357
/
empire
/
doc
/
update
< prev
next >
Wrap
Text File
|
1995-03-14
|
9KB
|
232 lines
Amiga Empire by Chris Gray - Updating
This section is quite detailed. The details are provided so that those who
want to run their country optimally can see what they need to see. Others
(especially beginners) should just ignore this section until they have
played for a while, at which point they should scan it to get a feel for
how things happen.
The sector update algorithm is central to Empire. It is based on steady
change over Empire Time Units. It can be summarized as follows (values are
either for the sector being updated or for the owner country of the sector;
all calculations are integral):
NOTE: A deity can change most of the magic numbers.
proc makeProduction():
q := min(work * efficiency / 100, ore);
if <sector not contracted> then
if money > 0 then
q := min(q, 127 - production);
production := production + q;
fi;
else
q2 := q * priceInNickels / 20;
money := money + q2;
fi;
ore := ore - q;
corp;
/* in an urban center, people are lazy, so every 10 counts as 1 here */
workForce := civilians + military / 5;
if lastUpdate = 0 or lastUpdate > CurrentTime then
lastUpdate := CurrentTime;
fi;
deltaTime := CurrentTime - lastUpdate;
if deltaTime > 256 then
deltaTime := 256;
fi;
work := deltaTime * workForce;
if work >= 100 and (<I own this sector> or work > 48 * 2 * 100) then
if weather <= -9 then
/* hurricane */
damageSector(random(21) + 70);
elif weather <= -8 then
/* no construction happens */
else
q := 0;
if weather <= -7 then
if money > 0 then
q := min(work / 200, 100 - efficiency);
fi;
mobility := min(127, mobility + deltaTime / 2);
else
if money > 0 then
q := min(work / 100, 100 - efficiency);
fi;
mobility := min(127, mobility + deltaTime);
fi;
efficiency := efficiency + q;
money := money - q;
fi;
/* civilian growth */
q := deltaTime * civilians;
if designation = <urban area> then
q := min(127, civilians + min(q / 100, ore)) - civilians;
civilians := civilians + q;
ore := ore - q;
elif designation = <bridge span> then
civilians := civilians - q / 400;
elif civilians > 31 and civilians < 97 then
civilians := min(127, civilians + q / 200);
else
civilians := min(127, civilians + q / 400);
fi;
/* mobility increase */
mobility := min(127, mobility + deltaTime);
lastUpdate := lastUpdate + deltaTime; /* NOTE THIS!!! */
/* military supplies */
q := military / 32 * deltaTime / 8;
money := money - q;
if <this is owner's active capital> then
BTUs :=
min(96, BTUs + deltaTime * civilians * efficiency / 5000);
researchLevel :=
researchLevel - researchLevel * deltaTime / 4800;
techLevel := techLevel - techLevel * deltaTime / 4800;
fi;
case plague_stage:
incase 3:
/* terminal plague stage */
<kill some people off>;
<send telegram, make news>;
if plague_time <= deltaTime then
plague_stage := 0;
else
plague_time := plague_time - deltaTime;
fi;
incase 2:
/* infectious stage */
if plague_time <= deltaTime then
plague_stage := 3;
plague_time := random(33) + 32;
else
plague_time := plague_time - deltaTime;
fi;
incase 1:
/* gestatory stage */
if plague_time <= deltaTime then
plague_stage := 2;
plague_time := random(33) + 32;
<send telegram, create news>;
else
plague_time := plague_time - deltaTime;
fi;
incase 0:
/* not infected - see if it should become so */
plagueFactor :=
((civilians + military) / 254) *
((techLevel + ore + 100) /
(researchLevel + efficiency + mobility + 100));
if random(100) < plagueFactor then
plague_stage := 1;
plague_time := random(33) + 32;
fi;
esac;
/* note that 'move', and deliveries will pass the plague when it is
in the infectious stage */
<do any deliveries out of this sector - special handling is done
when delivering civilians or military into a sector that hasn't
been updated for a long time>
if efficiency >= 60 then /* NOTE THIS!!! */
case designation
incase <bank>:
/* interest */
money := money + deltaTime * goldBars / 2;
incase <capital>:
incase <radar station>:
incase <weather station>:
/* utilities */
money := money - deltaTime;
incase <technology center>:
incase <research institute>:
/* utilities */
money := money - deltaTime;
if money > 0 then
q := production / 25;
production := production - q * 25;
if designation = <technology center> then
techLevel := techLevel + q;
else
researchLevel := researchLevel + q;
fi;
fi;
makeProduction();
incase <defense plant>:
if money > 0 then
q := min(production / 10, 127 - guns);
production := production - q * 10;
guns := guns + q;
fi;
makeProduction();
incase <shell industry>:
if money > 0 then
q := min(production / 2, 127 - shells);
production := production - q * 2;
shells := shells + q;
fi;
makeProduction();
incase <airfield>:
if money > 0 then
q := min(production / 25, 127 - planes);
production := production - q * 25;
planes := planes + q;
fi;
makeProduction();
incase <harbor>:
incase <bridge head>:
makeProduction();
incase <gold mine>:
q := min(production / 5, 127 - goldBars);
production := production - q * 5;
goldBars := goldBars + q;
q := min(goldSample * work * effic / 1000000, goldSample);
if <sector not contracted> then
if money > 0 then
q := min(q, (127 - production) / 2);
production := production + q * 2;
fi;
else
q2 := q * 2 * priceInNickels / 20;
money := money + q2;
fi;
goldSample := goldSample - q;
incase <mine>:
q := mineralSample * efficiency * work / 10000;
if <sector not contracted> then
if money > 0 then
ore := min(127, ore + q);
fi;
else
q2 := q * priceInNickels / 20;
money := money + q2;
fi;
esac;
fi;
fi;
Ship updates are much simpler:
if lastUpdate = 0 or lastUpdate > CurrentTime then
lastUpdate := CurrentTime;
fi;
deltaTime := CurrentTime - lastUpdate;
if deltaTime >= 3 then
lastUpdate := lastUpdate + deltaTime;
if weather <= -9 and shipType ~= 's' then
damageShip((random(21) + 10) * shipDamageFactor(shipType));
elif weather <= -8 and shipType ~= 's' then
/* bad weather halts construction */
else
if weather <= -7 and shipType ~= 's' then
/* bad weather delays construction */
deltaTime := deltaTime / 2;
fi;
mobility := min(127, mobility + deltaTime);
efficiency := min(100, efficiency + deltaTime);
techLevel :=
techLevel - techLevel * dt * shipTechDecreaser / 480000;
fi;
fi;